Instrucciones

  1. Poned vuestro nombre arriba, done pone “author:”. No os olvidéis de las comillas.

  2. Poned también vuestro nombre en los archivos .Rmd y .html que generéis.

  3. Tienes que subir al moodle el archivo .html y el .Rmd.

  4. La fecha límite de entrega es el lunes 25 de noviembre a las 23:55.

  5. Recordatorio: para resolver los ejercicios tienes que crear chunks donde escribir el código. Puedes crear un chunk para cada ejercicio o para cada pregunta; haz lo que te sea más cómodo, pero mi recomendación es que los chunks sean pequeños.

  6. Si tenéis alguna pregunta no dudéis en escribirme a eudald@correig.net.

Nota: en terminar los ejercicios tenéis que darle a Knit para que se genere el informe html. Ahora, no os esperéis a tenerlo todo terminado para generar el informe; generadlo antes de empezar y también cada vez que terminéis un chunk.

Práctica

Librerías

library("openxlsx")
library("ggplot2")

Introducción

Se pretende identificar ineficiencias en el proceso de venta o factores internos y externos que pueden estar impactando el rendimiento de las mismas de una empresa de dispositivos electrónicos para las franquicias de todo el país.

Las variables son las siguientes:

  1. Rentabieco = Rentabilidad económica
  2. Rentabifin = Rentabilidad financier
  3. Endp = Nivel de endeudamiento de las franquicias que venden estos dispositivos, valorado en euros
  4. Liq = Liquidez monetaria de las franquicias
  5. Productividad = ratio. Buscar la relación que puede tener con otras variables.
  6. Coe = cuota de mercado
  7. Edad = tiempo que llevan las franquicias operando
  8. Conce = número de entidades que dan este mismo servicio a nivel municipio
  9. Numac = nº accionistas
  10. Numpa = nº participados
  11. Numest = nº establecimientos por empresa
  12. Estp = nº establecimientos en otras provincias

Ejercicio 0

Teniendo en cuenta la descripción de cada variable, y los valores que véis en éstas, formatead correctamente el dataframe.

En primer lugar abrimos la tabla y la asignamos a la variable dades.

dades = read.xlsx("datos/DatosPractica.xlsx")

Una vez tenemos la tabla, usamos el comando structure para saber el tipo de variable que R le ha asignado a cada una:

str(dades)
## 'data.frame':    4403 obs. of  18 variables:
##  $ REGISTRO           : num  1 2 3 4 5 6 7 8 9 10 ...
##  $ PROVINCIA          : chr  "Albacete" "Albacete" "Albacete" "Albacete" ...
##  $ rentabieco         : num  0.86 -4.748 -0.322 12.99 1.461 ...
##  $ rentabifin         : num  8.4 -20.15 -1.93 28.38 55.74 ...
##  $ endp               : num  89.8 76.4 83.3 54.2 97.4 ...
##  $ liq                : num  1.102 1.308 0.854 1.577 1.009 ...
##  $ PRODUCTIVIDAD      : num  114.9 146.4 11.7 19.3 37 ...
##  $ VENTAS             : num  1270 338 17715 20848 1239 ...
##  $ NÚMERO.DE.EMPLEADOS: num  1 1 46 40 2 54 1 2 8 2 ...
##  $ coe                : num  0.00493 0.00131 0.06871 0.08086 0.0048 ...
##  $ edad               : num  2 8 25 24 2 40 10 11 10 15 ...
##  $ conce              : num  9 9 34 34 3 34 34 34 9 34 ...
##  $ numac              : num  1 0 3 3 0 1 1 1 3 0 ...
##  $ numpa              : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ numest             : num  1 1 2 2 2 7 1 1 1 2 ...
##  $ estp               : num  0 0 0 0 0 1 0 0 0 0 ...
##  $ grupo              : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ fju                : num  0 0 1 1 0 1 0 0 1 1 ...

Cambiamos las variables “estp”, “grupo” y “fju” a variables categóricas y comprobamos de nuevo, además suprimimos la primera columna REGISTRO:

dades$REGISTRO=NULL
dades$estp=as.factor(dades$estp)
dades$grupo=as.factor(dades$grupo)
dades$fju=as.factor(dades$fju)
str(dades)
## 'data.frame':    4403 obs. of  17 variables:
##  $ PROVINCIA          : chr  "Albacete" "Albacete" "Albacete" "Albacete" ...
##  $ rentabieco         : num  0.86 -4.748 -0.322 12.99 1.461 ...
##  $ rentabifin         : num  8.4 -20.15 -1.93 28.38 55.74 ...
##  $ endp               : num  89.8 76.4 83.3 54.2 97.4 ...
##  $ liq                : num  1.102 1.308 0.854 1.577 1.009 ...
##  $ PRODUCTIVIDAD      : num  114.9 146.4 11.7 19.3 37 ...
##  $ VENTAS             : num  1270 338 17715 20848 1239 ...
##  $ NÚMERO.DE.EMPLEADOS: num  1 1 46 40 2 54 1 2 8 2 ...
##  $ coe                : num  0.00493 0.00131 0.06871 0.08086 0.0048 ...
##  $ edad               : num  2 8 25 24 2 40 10 11 10 15 ...
##  $ conce              : num  9 9 34 34 3 34 34 34 9 34 ...
##  $ numac              : num  1 0 3 3 0 1 1 1 3 0 ...
##  $ numpa              : num  0 0 0 0 0 0 0 0 0 0 ...
##  $ numest             : num  1 1 2 2 2 7 1 1 1 2 ...
##  $ estp               : Factor w/ 2 levels "0","1": 1 1 1 1 1 2 1 1 1 1 ...
##  $ grupo              : Factor w/ 2 levels "0","1": 1 1 1 1 1 1 1 1 1 1 ...
##  $ fju                : Factor w/ 2 levels "0","1": 1 1 2 2 1 2 1 1 2 2 ...

Para el desarrollo de este estudio se sugiere seguir las siguientes instrucciones:

Ejercicio 1

Análisis descriptivo. Estudiar la distribución de las variables, así como detectar posibles valores atípicos o relaciones.

En el siguiente apartado vamos a analizar la distribución de las diferentes variables, en el caso de las numéricas empezaremos haciendo un histograma para ver su distribución y realizaremos el test de Shapiro Wilk para confirmar si siguen una distribución normal o no. En el test de Shapiro Wilk planteamos como hipótesis nula que la variable tiene una distribución normal, si p-value es menor de 0.05 rechazamos la hipótesis nula y por tanto aceptaremos la hipótesis alternativa, en este caso que la variable no tiene un distribución normal. En función de la distribución de los datos de la variable daremos más importancia a la media (si es normal) o a la mediana (sino es normal). Añadiremos también un boxplot de las variables numéricas para resaltar la aparición de posibles outliers.

Empezamos analizando la primera variable numérica: Rentabilidad Económica

summary(dades$rentabieco) #Usamos la función summary que nos devuelve el resumen de la varibale.
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## -179.7045    0.1294    1.7748    0.7648    4.8275   48.4145
shapiro.test(dades$rentabieco) #Shapiro test para ver si la variable sigue una distribución normal o no, si p>0.05 la consideraremos normal.
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$rentabieco
## W = 0.62281, p-value < 2.2e-16
hist(dades$rentabieco, xlab = "Rentabilidad Económica", main = NULL) #Hacemos un histograma para confirmar la distribución de los datos.

La distribución de la variable no es normal según Shapiro test, y además lo confirmamos con un histograma. Vemos que la distribución de los datos tiene cola a la izquierda, los datos están sesgados a la izquierda. Podemos ver que la mediana se sitúa en el valor 1.77, que es el valor central, viendo que el valor mínimo es -179.70 y el mayor 48.41. Al no seguir una distribución normal la media no es representativa.

Terminamos el análisis con un boxplot para remarcar la aparición de los outliers:

boxplot(dades$rentabieco)

Seguimos con el análisis de la rentabilidad financiera:

summary(dades$rentabifin)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
## -459.480    2.658   10.671   16.198   24.988  494.178
hist(dades$rentabifin, xlab = "Rentabilidad Financiera", main = NULL)

shapiro.test(dades$rentabifin)
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$rentabifin
## W = 0.67036, p-value < 2.2e-16

Al hacer el histograma y el shapiro test podemos confirmar que la variable no sigue una distribución normal.

boxplot(dades$rentabifin)

Nivel de endeudamiento de las franquicias:

summary(dades$endp)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00   61.21   79.15   79.53   93.25  433.21
hist(dades$endp, xlab = "Endeudamiento franquicias", main = NULL)

shapiro.test(dades$endp)
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$endp
## W = 0.81696, p-value < 2.2e-16

Lo primero que observamos al hacer el summary es que hay outliers, vemos que la mediana es 79.15 y el valor máximo 433.21, además lo confirmamos con el histograma, que nos da sesgo a la derecha. Por otro lado el endeudamiento tampoco sigue una distribución normal.

boxplot(dades$endp)

Liquidez financiera:

summary(dades$liq)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
##   0.01527   0.94691   1.15317   1.90566   1.54464 113.15031
hist(dades$liq, xlab = "Liquidez financiera", main = NULL)

shapiro.test(dades$liq)
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$liq
## W = 0.17047, p-value < 2.2e-16

Se repite la aparición de outliers, con la mediana en 1.15, el 3r cuartil en 1.54 y el valor máximo en 113.15. El histograma nos muestra que la mayoría de datos están entre 0 y 10 aproximadamente, habiendo sesgo a la derecha. El shapiro test nos confirma la no normalidad de la variable.

boxplot(dades$liq)

Productividad:

summary(dades$PRODUCTIVIDAD)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  -1.172   5.085  11.755  16.224  18.783 268.593
hist(dades$PRODUCTIVIDAD, xlab = "Productividad", main = NULL)

shapiro.test(dades$PRODUCTIVIDAD)
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$PRODUCTIVIDAD
## W = 0.58933, p-value < 2.2e-16
boxplot(dades$PRODUCTIVIDAD)

Igual que en los anteriores casos, nos encontramos con una variable con outliers hacia la derecha del gráfico histograma, con el tercer cuartil situado en 18.783 y el valor máximo en 268.593. El histograma de la variable confirma el sesgo a la derecha y la repartición de la mayoría de los datos entre 0 y 50 aproximadamente, encontrando la mediana en 11.755. Shapiro test nos da la confirmación de que la variable no sigue una distribución normal.

Ventas:

summary(dades$VENTAS)
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##     4.92   494.89  1592.14  6648.16  7819.91 77055.79
hist(dades$VENTAS, xlab = "Ventas", main = NULL)

shapiro.test(dades$VENTAS)
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$VENTAS
## W = 0.62097, p-value < 2.2e-16
boxplot(dades$VENTAS)

Variable con distribución no normal, tenemos la mediana en 1592.14 con el valor máximo en 77055.79, tenemos el tercer cuartil en 7819.91, quedando reflejado en el boxplot.

Cuota de mercado:

summary(dades$coe)
##      Min.   1st Qu.    Median      Mean   3rd Qu.      Max. 
## 0.0000012 0.0004909 0.0021491 0.0118101 0.0106936 0.5060498
hist(dades$coe, xlab = "Cuota de mercado", main = NULL)

shapiro.test(dades$coe)
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$coe
## W = 0.47735, p-value < 2.2e-16
boxplot(dades$coe)

Variable con distribución no normal, sesgo a la derecha. Confirmamos también con el histograma. El summary nos dice que tenemos la mediana en 0.0021 y el valor máximo en 0.50, aparecen outliers otra vez.

Tiempo que las franquicias llevan operando:

summary(dades$edad)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##    0.00    5.00   11.00   12.29   18.00   49.00
hist(dades$edad, xlab = "Tiempo franquicias operando", main = NULL)

shapiro.test(dades$edad)
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$edad
## W = 0.92737, p-value < 2.2e-16
boxplot(dades$edad)

Variable con distribución no normal, aparición de outliers en rango superior, confirmamos con boxplot.

Número de entidades que dan este mismo servicio a nivel de municipio:

summary(dades$conce)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     1.0     4.0    11.0    29.8    28.0   215.0
hist(dades$conce, xlab = "Nº entidades que dan el mismo servicio en municipio", main = NULL)

shapiro.test(dades$conce)
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$conce
## W = 0.55731, p-value < 2.2e-16
str(dades$conce)
##  num [1:4403] 9 9 34 34 3 34 34 34 9 34 ...

Variable con un mínimo de 1, una mediana de 11 y un valor máximo de 215, confirma aparición de outliers. Distribución no normal.

Número de accionistas:

summary(dades$numac)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   0.000   0.000   1.000   1.228   2.000  17.000
hist(dades$numac, xlab = "Número accionistas", main = NULL)

shapiro.test(dades$numac)
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$numac
## W = 0.72155, p-value < 2.2e-16
boxplot(dades$numac)

Variable con un mínimo de 0, una mediana de 1 y un máximo de 17. No normalidad, histograma sesgado a la derecha.

Número de participados:

summary(dades$numpa)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##  0.0000  0.0000  0.0000  0.1687  0.0000 20.0000
hist(dades$numpa, xlab = "Número participados", main = NULL)

shapiro.test(dades$numpa)
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$numpa
## W = 0.23741, p-value < 2.2e-16

El número de participados vuelve a seguir una distribución no normal, hacemos histograma y confirmamos con Shapiro Test, y además añadimos que tenemos una mediana de 0, un mínimo de 0 y un máximo de 20. Gráfico totalmente sesgado hacia la derecha.

boxplot(dades$numpa)

Número de establecimientos por empresa:

summary(dades$numest)
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##   1.000   1.000   1.000   1.714   2.000  34.000
hist(dades$numest, xlab = "Número establecimientos empresa", main = NULL)

shapiro.test(dades$numest)
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$numest
## W = 0.54378, p-value < 2.2e-16
boxplot(dades$numest)

Variable no normal con sesgo a la derecha. Mediana de 1 y valor máximo de 34. Presencia de outliers.

En cuanto a las variables Número de establecimientos en otras provincias, grupo y fju, las consideramos categóricas porque su rango va de 0 a 1.

summary(dades$estp)
##    0    1 
## 4264  139
summary(dades$grupo)
##    0    1 
## 4164  239
summary(dades$fju)
##    0    1 
## 3181 1222

Para finalizar hacemos un gráfico pairs para comparar todas las variables, creo un nuevo dataframe en el que suprimero la variable provincia, ya que en este gráfico todas las variables tienen que ser numéricas:

dades2 = dades
dades2$PROVINCIA=NULL
dades2$estp = as.numeric(dades2$estp)
dades2$grupo = as.numeric(dades2$grupo)
dades2$fju = as.numeric(dades$fju)
pairs(dades2)

Además añadimos un dataframe con las correlaciones entre variables para ver el marco general, y poder extraer además conclusiones para el siguiente ejercicio:

cor(dades2[1:13], method = "spearman")
##                      rentabieco  rentabifin        endp          liq
## rentabieco           1.00000000  0.36063104 -0.49535976  0.365129667
## rentabifin           0.36063104  1.00000000  0.17409743 -0.075473148
## endp                -0.49535976  0.17409743  1.00000000 -0.664222822
## liq                  0.36512967 -0.07547315 -0.66422282  1.000000000
## PRODUCTIVIDAD        0.16232276  0.15659382  0.03998395  0.024368435
## VENTAS               0.23545994 -0.05019929 -0.28476237  0.135286336
## NÚMERO.DE.EMPLEADOS  0.17415877 -0.13992167 -0.32746949  0.117031793
## coe                  0.22037068 -0.04160632 -0.26692504  0.113894237
## edad                 0.13780245 -0.25651913 -0.42390922  0.216409704
## conce               -0.02746532 -0.03703723 -0.01807275 -0.004232505
## numac                0.16020660 -0.06260424 -0.25089611  0.122707612
## numpa                0.05522389 -0.07329598 -0.16198863  0.052378331
## numest               0.08515270 -0.03323358 -0.11384735  0.017630458
##                     PRODUCTIVIDAD      VENTAS NÚMERO.DE.EMPLEADOS
## rentabieco             0.16232276  0.23545994           0.1741588
## rentabifin             0.15659382 -0.05019929          -0.1399217
## endp                   0.03998395 -0.28476237          -0.3274695
## liq                    0.02436843  0.13528634           0.1170318
## PRODUCTIVIDAD          1.00000000  0.49029662           0.0036268
## VENTAS                 0.49029662  1.00000000           0.8123219
## NÚMERO.DE.EMPLEADOS    0.00362680  0.81232190           1.0000000
## coe                    0.42332048  0.84255657           0.6989915
## edad                  -0.09939556  0.41226494           0.5336445
## conce                  0.19353420  0.26089027           0.1595496
## numac                  0.18414947  0.53966169           0.4929155
## numpa                  0.05331649  0.32548523           0.3373081
## numest                 0.10561006  0.42548731           0.4277879
##                             coe        edad        conce       numac
## rentabieco           0.22037068  0.13780245 -0.027465322  0.16020660
## rentabifin          -0.04160632 -0.25651913 -0.037037225 -0.06260424
## endp                -0.26692504 -0.42390922 -0.018072747 -0.25089611
## liq                  0.11389424  0.21640970 -0.004232505  0.12270761
## PRODUCTIVIDAD        0.42332048 -0.09939556  0.193534195  0.18414947
## VENTAS               0.84255657  0.41226494  0.260890269  0.53966169
## NÚMERO.DE.EMPLEADOS  0.69899154  0.53364450  0.159549619  0.49291547
## coe                  1.00000000  0.36709630  0.123245143  0.47762343
## edad                 0.36709630  1.00000000  0.049875576  0.33412672
## conce                0.12324514  0.04987558  1.000000000  0.13604781
## numac                0.47762343  0.33412672  0.136047805  1.00000000
## numpa                0.27739539  0.25615885  0.099889112  0.25645230
## numest               0.34799831  0.23181796  0.113542386  0.26779229
##                           numpa      numest
## rentabieco           0.05522389  0.08515270
## rentabifin          -0.07329598 -0.03323358
## endp                -0.16198863 -0.11384735
## liq                  0.05237833  0.01763046
## PRODUCTIVIDAD        0.05331649  0.10561006
## VENTAS               0.32548523  0.42548731
## NÚMERO.DE.EMPLEADOS  0.33730810  0.42778786
## coe                  0.27739539  0.34799831
## edad                 0.25615885  0.23181796
## conce                0.09988911  0.11354239
## numac                0.25645230  0.26779229
## numpa                1.00000000  0.22002050
## numest               0.22002050  1.00000000

Ejercicio 2

Análisis del Comportamiento de las Ventas y Variables que le Afectan.

Para entender como afectan otras variables a la ventas tenemos que hacer un test de correlación, para demostrar si hay correlación entre las dos variables, haríamos un test de correlación de Fisher si las variables tienen una distribución normal y el de “Spearman” si una de ellas no sigue una distribución normal. Para realizar los tests consideramos la variable VENTAS la variable dependiente, ya que queremos saber cómo se ve afectada en función de los cambios que suceden en las variables independientes. Anteriormente con el gráfico pairs y la matriz de correlación ya hemos intuïdo que hay cierta correlación entre las ventas y el número de empleados, la cuota de mercado y el número de establecimientos por empresa, pero vamos a hacer los test con todas las variables para confirmar.

Ventas en relación con la Rentabilidad Económica:

cor.test(dades$rentabieco, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$rentabieco, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  dades$rentabieco and dades$VENTAS
## S = 1.0877e+10, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.2354599

No hay correlación.

Ventas con rentabilidad financiera: no hay correlación

cor.test(dades$rentabifin, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$rentabifin, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  dades$rentabifin and dades$VENTAS
## S = 1.4941e+10, p-value = 0.0008618
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##         rho 
## -0.05019929

Ventas con el nivel de endeudamiento de las franquicias: no hay correlación:

cor.test(dades$endp, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$endp, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  dades$endp and dades$VENTAS
## S = 1.8278e+10, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##        rho 
## -0.2847624

Influencia que tiene la Productividad en las ventas:

cor.test(dades$PRODUCTIVIDAD, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$PRODUCTIVIDAD, dades$VENTAS, method =
## "sp"): Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  dades$PRODUCTIVIDAD and dades$VENTAS
## S = 7251240260, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.4902966

El test de Spearman nos da una rho de 0.49 con un p-value muy significativo, dando mucha validez al test. Obtenemos una baja correlación positiva. Hacemos un qqplot para comprobar visualmente el resultado:

qqplot(dades$PRODUCTIVIDAD, dades$VENTAS, xlab = "Productividad", ylab = "Ventas")

Aquí si que se intuye la recta.

Ventas en función del número de empleados:

cor.test(dades$NÚMERO.DE.EMPLEADOS, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$NÚMERO.DE.EMPLEADOS, dades$VENTAS, method
## = "sp"): Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  dades$NÚMERO.DE.EMPLEADOS and dades$VENTAS
## S = 2.67e+09, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.8123219
plot(dades$NÚMERO.DE.EMPLEADOS, dades$VENTAS, xlab = "Número de empleados", ylab = "Ventas")

qqplot(dades$NÚMERO.DE.EMPLEADOS, dades$VENTAS, xlab = "Número de empleados", ylab = "Ventas")

Mucha significancia del test con un p-value muy pequeño (casi 0) y un resultado rho de 0.81, buena correlación positiva que se ve plasmada en ambos gráficos.

Ventas sobre Cuota de mercado:

cor.test(dades$coe, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$coe, dades$VENTAS, method = "sp"): Cannot
## compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  dades$coe and dades$VENTAS
## S = 2239852029, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.8425566
qqplot(dades$coe, dades$VENTAS, xlab = "Cuota de mercado", ylab = "Ventas")

Mucha correlación 0.85 y muy buena significancia del test.

Ventas en función del tiempo que llevan las franquicias operando: baja correlación positiva

cor.test(dades$edad, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$edad, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  dades$edad and dades$VENTAS
## S = 8361349609, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.4122649

Ventas en función del número de entidades que dan el mismo servicio a nivel de municipio: no hay correlación

cor.test(dades$conce, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$conce, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  dades$conce and dades$VENTAS
## S = 1.0515e+10, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.2608903

Ventas en función del número de accionistas: baja correlación positiva

cor.test(dades$numac, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$numac, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  dades$numac and dades$VENTAS
## S = 6.549e+09, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.5396617

Ventas sobre número de participados: muy baja correlación.

cor.test(dades$numpa, dades$VENTAS, method = "sp")
## Warning in cor.test.default(dades$numpa, dades$VENTAS, method = "sp"):
## Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  dades$numpa and dades$VENTAS
## S = 9595911793, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.3254852

Ventas en función del número de establecimientos por empresa: baja correlación positiva

cor.test(dades$VENTAS, dades$numest, method = "sp")
## Warning in cor.test.default(dades$VENTAS, dades$numest, method = "sp"):
## Cannot compute exact p-value with ties
## 
##  Spearman's rank correlation rho
## 
## data:  dades$VENTAS and dades$numest
## S = 8173242936, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.4254873

Ventas en función del número de establecimientos en otras provincias: en este caso como consideramos la variable número de establecimientos categórica, tenemos que hacer el test de Chi cuadrado

chisq.test(dades$estp, dades$VENTAS)
## Warning in chisq.test(dades$estp, dades$VENTAS): Chi-squared approximation
## may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  dades$estp and dades$VENTAS
## X-squared = 4403, df = 4398, p-value = 0.4759
plot(dades$estp, dades$VENTAS, xlab = "Nº Establecimientos", ylab= "Ventas")

P-value nos da mayor de 0.05, aceptamos la hipótesis nula que en este caso sería que no hay asociación significativa de la varible dependiente en función de las categorías de la independiente.

***Por último miramos correlación entre las ventas y las variables categóricas grupo y fju.

chisq.test(dades$grupo, dades$VENTAS)
## Warning in chisq.test(dades$grupo, dades$VENTAS): Chi-squared approximation
## may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  dades$grupo and dades$VENTAS
## X-squared = 4403, df = 4398, p-value = 0.4759
chisq.test(dades$fju, dades$VENTAS)
## Warning in chisq.test(dades$fju, dades$VENTAS): Chi-squared approximation
## may be incorrect
## 
##  Pearson's Chi-squared test
## 
## data:  dades$fju and dades$VENTAS
## X-squared = 4398, df = 4398, p-value = 0.4971
boxplot(dades$VENTAS~dades$grupo, xlab = "grupo", ylab = "Ventas")

boxplot(dades$VENTAS~dades$fju, xlab = "fju", ylab = "Ventas")

Ejercicio 3

Realizar una tabla de contingencia entre Ventas y Número de empleados, una vez categorizadas ambas variables, para número de empleados, por ejemplo, la utilizada a nivel Europeo, la cual divide a las empresas en Microempresas (1-9 trabajadores), Pequeña empresa (10-49 trabajadores), Mediana empresa (50-249 trabajadores) y Gran empresa (250 y más trabajadores)).

La variable ventas la dividiremos basándonos en los cuartiles.

tipo_empresa = cut(dades$NÚMERO.DE.EMPLEADOS, breaks = c(0,10,50,250,Inf), labels = c("Microempresas", "Pequeña empresa", "Mediana empresa", "Gran empresa"), right = FALSE)
segmento_ventas = cut(dades$VENTAS, breaks = c(0,494.89,1592.14,7819,Inf), labels = c("Muy pocas ventas", "Pocas ventas", "Buenas ventas", "Muy buenas ventas"), right = FALSE)
df = data.frame(x=tipo_empresa, y=segmento_ventas)
colnames(df)=c("Tipo empresa", "Ventas") 
summary(df)
##           Tipo empresa                Ventas    
##  Microempresas  :2561   Muy pocas ventas :1101  
##  Pequeña empresa:1501   Pocas ventas     :1100  
##  Mediana empresa: 341   Buenas ventas    :1101  
##  Gran empresa   :   0   Muy buenas ventas:1101

Ahora podemos combinar ambos data frames para ver los datos originales y nuestra clasificación propuesta:

df2=data.frame(dades$NÚMERO.DE.EMPLEADOS, tipo_empresa, dades$VENTAS, segmento_ventas)
summary(df2) 
##  dades.NÚMERO.DE.EMPLEADOS          tipo_empresa   dades.VENTAS     
##  Min.   :  1.00            Microempresas  :2561   Min.   :    4.92  
##  1st Qu.:  3.00            Pequeña empresa:1501   1st Qu.:  494.89  
##  Median :  7.00            Mediana empresa: 341   Median : 1592.14  
##  Mean   : 16.34            Gran empresa   :   0   Mean   : 6648.16  
##  3rd Qu.: 21.00                                   3rd Qu.: 7819.91  
##  Max.   :169.00                                   Max.   :77055.79  
##           segmento_ventas
##  Muy pocas ventas :1101  
##  Pocas ventas     :1100  
##  Buenas ventas    :1101  
##  Muy buenas ventas:1101  
##                          
## 

Ejercicio 4

Comparar las ventas entre Madrid y Barcelona.

Nuestra hipótesis nula es que las ventas son iguales, y la alternativa que las ventas no son iguales.

summary(dades$VENTAS[dades$PROVINCIA=="Madrid"])
##    Min. 1st Qu.  Median    Mean 3rd Qu.    Max. 
##     5.8   451.2  1827.7  8072.1  8622.3 73605.2
summary(dades$VENTAS[dades$PROVINCIA=="Barcelona"])
##     Min.  1st Qu.   Median     Mean  3rd Qu.     Max. 
##     4.92   590.37  1855.45  7599.87  9790.40 65683.80

Miramos la normalidad de ambas variables:

shapiro.test(dades$VENTAS[dades$PROVINCIA=="Madrid"])
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$VENTAS[dades$PROVINCIA == "Madrid"]
## W = 0.61752, p-value < 2.2e-16
shapiro.test(dades$VENTAS[dades$PROVINCIA=="Barcelona"])
## 
##  Shapiro-Wilk normality test
## 
## data:  dades$VENTAS[dades$PROVINCIA == "Barcelona"]
## W = 0.65681, p-value < 2.2e-16

Hacemos boxplot para comparar de forma visual:

boxplot(dades$VENTAS[dades$PROVINCIA=="Madrid"], dades$VENTAS[dades$PROVINCIA=="Barcelona"], names = c("Madrid", "Barcelona"))

Finalmente Wilcox Test para comparar ambas variables con distribución no normal y muestras independientes:

wilcox.test(dades$VENTAS[dades$PROVINCIA=="Madrid"], dades$VENTAS[dades$PROVINCIA=="Barcelona"], alternative="two.sided")
## 
##  Wilcoxon rank sum test with continuity correction
## 
## data:  dades$VENTAS[dades$PROVINCIA == "Madrid"] and dades$VENTAS[dades$PROVINCIA == "Barcelona"]
## W = 124196, p-value = 0.2924
## alternative hypothesis: true location shift is not equal to 0

El test nos da una p>0.05 que significa que no podemos rechazar la hipotesis nula, por lo tanto aceptamos que las ventas son “iguales”.

Ejercicio 5

Presentación del modelo de predicción de las ventas para el siguiente año y describirla adecuadamente.

mod_total=lm(dades$VENTAS~., data=dades)
summary(mod_total)
## 
## Call:
## lm(formula = dades$VENTAS ~ ., data = dades)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -45650  -1473     15   1257  45304 
## 
## Coefficients:
##                                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                    -3477.6187   842.9156  -4.126 3.77e-05 ***
## PROVINCIAAlbacete               -771.4173  1038.1342  -0.743  0.45747    
## PROVINCIAAlicante               1442.9352   866.5865   1.665  0.09597 .  
## PROVINCIAAlmería               -1026.7817  1030.1211  -0.997  0.31894    
## PROVINCIAAsturias                782.5455   943.9422   0.829  0.40714    
## PROVINCIAÁvila                 -2115.7643  1407.5460  -1.503  0.13287    
## PROVINCIABadajoz                -542.9382  1008.0416  -0.539  0.59019    
## PROVINCIABaleares                739.4238   901.2991   0.820  0.41203    
## PROVINCIABarcelona              1813.2402   833.5663   2.175  0.02966 *  
## PROVINCIABurgos                 -968.1719  1060.9833  -0.913  0.36154    
## PROVINCIACáceres               -1392.3448  1111.3246  -1.253  0.21032    
## PROVINCIACádiz                   139.4134   966.2567   0.144  0.88528    
## PROVINCIACantabria              -449.0154  1051.8625  -0.427  0.66949    
## PROVINCIACastellón               288.1315  1004.6612   0.287  0.77428    
## PROVINCIACEUTA                 -4633.3983  1571.0122  -2.949  0.00320 ** 
## PROVINCIACiudad Real            -182.7733  1012.2809  -0.181  0.85672    
## PROVINCIACórdoba                 559.8192   955.4100   0.586  0.55794    
## PROVINCIACuenca                -2121.1568  1208.6096  -1.755  0.07932 .  
## PROVINCIAGerona                  745.7844   902.4406   0.826  0.40862    
## PROVINCIAGranada                -108.9618   995.6827  -0.109  0.91286    
## PROVINCIAGuadalajara           -1835.5224  1330.2767  -1.380  0.16772    
## PROVINCIAGuipúzcoa               853.8803   999.1449   0.855  0.39281    
## PROVINCIAHuelva                 -332.6200  1125.7756  -0.295  0.76766    
## PROVINCIAHuesca                   49.0760  1070.6014   0.046  0.96344    
## PROVINCIAJaén                   -206.5978   993.7284  -0.208  0.83532    
## PROVINCIALa Coruña              -183.2086   906.8112  -0.202  0.83990    
## PROVINCIALas Palmas              453.1893   947.7010   0.478  0.63253    
## PROVINCIALeón                   -141.2414   991.3153  -0.142  0.88671    
## PROVINCIALérida                  611.4607   963.1530   0.635  0.52556    
## PROVINCIALogroño                 736.3097  1094.4935   0.673  0.50115    
## PROVINCIALugo                     38.5481  1005.4357   0.038  0.96942    
## PROVINCIAMadrid                 1216.9172   847.5758   1.436  0.15114    
## PROVINCIAMálaga                  995.3057   901.3543   1.104  0.26955    
## PROVINCIAMELILLA               -7996.1856  1857.4713  -4.305 1.71e-05 ***
## PROVINCIAMurcia                 1467.2494   922.4837   1.591  0.11179    
## PROVINCIANavarra                1253.9711  1021.2754   1.228  0.21957    
## PROVINCIAOrense                -1158.2984  1142.1422  -1.014  0.31057    
## PROVINCIAPalencia              -2599.8538  1327.9829  -1.958  0.05032 .  
## PROVINCIAPontevedra              939.1657   932.0976   1.008  0.31371    
## PROVINCIASalamanca             -1557.5578  1090.5891  -1.428  0.15331    
## PROVINCIASegovia               -4693.4741  1442.4623  -3.254  0.00115 ** 
## PROVINCIASevilla                1552.0527   885.3439   1.753  0.07966 .  
## PROVINCIASoria                 -6621.8118  1517.3425  -4.364 1.31e-05 ***
## PROVINCIASta. Cruz de Tenerife  -271.1124   943.7339  -0.287  0.77391    
## PROVINCIATarragona               499.8006   969.9027   0.515  0.60636    
## PROVINCIATeruel                -1693.6145  1211.1755  -1.398  0.16209    
## PROVINCIAToledo                  912.2677   973.9739   0.937  0.34899    
## PROVINCIAValencia               1948.0868   859.4798   2.267  0.02346 *  
## PROVINCIAValladolid             -300.7586  1026.3034  -0.293  0.76950    
## PROVINCIAVizcaya                1247.7018   928.6968   1.343  0.17918    
## PROVINCIAZamora                -2506.3351  1195.1701  -2.097  0.03605 *  
## PROVINCIAZaragoza               1636.4636   948.6495   1.725  0.08459 .  
## rentabieco                        15.9461     6.0734   2.626  0.00868 ** 
## rentabifin                         0.7555     1.1290   0.669  0.50344    
## endp                               5.3223     2.3299   2.284  0.02240 *  
## liq                                5.7587    13.9754   0.412  0.68031    
## PRODUCTIVIDAD                     72.8051     3.5697  20.395  < 2e-16 ***
## NÚMERO.DE.EMPLEADOS              388.4635     4.7500  81.781  < 2e-16 ***
## coe                            72038.1086  3918.7066  18.383  < 2e-16 ***
## edad                             -25.8009     9.6694  -2.668  0.00765 ** 
## conce                              5.4114     1.6495   3.281  0.00104 ** 
## numac                             36.0670    50.8994   0.709  0.47862    
## numpa                            173.5887   102.1198   1.700  0.08923 .  
## numest                           308.8456    63.4762   4.866 1.18e-06 ***
## estp1                            356.9063   425.7129   0.838  0.40187    
## grupo1                           573.5868   320.6835   1.789  0.07374 .  
## fju1                             483.9113   194.9862   2.482  0.01311 *  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4595 on 4336 degrees of freedom
## Multiple R-squared:  0.8335, Adjusted R-squared:  0.831 
## F-statistic:   329 on 66 and 4336 DF,  p-value: < 2.2e-16
plot(mod_total)

Nuestros coeficientes son -3127.03 para la constante, la beta 0, y nuestras beta 1 las que siguen en la fila estimate, explicadas seguidamente.

Con este modelo explicamos el 83% de la variabilidad de las ventas en función de las variables Productividad, Número de empleados, Cuota de mercado, Nº que dan este mismo servicio a nivel municipio y Nº de establecimientos en otras provincias.

Por lo tanto mis ventas predecidas iran en función delas beta comentadas anteriormente: + 1813.24 Provincia Barcelona + -4633.39 Ceuta + -7996.18 Melilla + -4693.47 Segovia + -6621.81 Soria + 1948.08 Valencia + -2506.33 Zamora + 15.94 Rentabilidad Económica + 5.32 Nivel endeudamiento económico + 72.80 Productividad + 388.46 Número de empleados + 72038.10 Cuota de mercado + 5.41 Nº entidades que dan el mismo servicio a nivel municipio + 308.84 Nº establecimientos por empresa + 483.91 FJU

En cuanto a los residuos, a mi entender están un poco dispersos sobretodo por la aprición de outliers, y se podría ajustar el modelo eliminando outliers. Recordemos que los residuos del modelo tienen que tener normalidad, homocesdasticidad (varianza constante), linealidad e independencia. Vemos que en los plots se concentran mucho a la izquierda del grçafico y en el qqplot hay “colas” acentuadas en la distribución.

Ahora vamos a crear un train set para comprobar el modelo y verificar su significancia:

train = sample(nrow(dades), round(nrow(dades))/5*4)
mod2=lm(dades$VENTAS~., data = dades, subset = train)
summary(mod2)
## 
## Call:
## lm(formula = dades$VENTAS ~ ., data = dades, subset = train)
## 
## Residuals:
##    Min     1Q Median     3Q    Max 
## -44605  -1445      4   1239  46087 
## 
## Coefficients:
##                                  Estimate Std. Error t value Pr(>|t|)    
## (Intercept)                    -3.169e+03  9.391e+02  -3.375 0.000748 ***
## PROVINCIAAlbacete              -1.188e+03  1.132e+03  -1.050 0.293845    
## PROVINCIAAlicante               1.381e+03  9.628e+02   1.434 0.151670    
## PROVINCIAAlmería               -1.157e+03  1.154e+03  -1.002 0.316221    
## PROVINCIAAsturias               7.143e+02  1.054e+03   0.678 0.497883    
## PROVINCIAÁvila                 -2.319e+03  1.778e+03  -1.305 0.192126    
## PROVINCIABadajoz               -7.980e+02  1.132e+03  -0.705 0.480784    
## PROVINCIABaleares               4.527e+02  1.002e+03   0.452 0.651576    
## PROVINCIABarcelona              1.416e+03  9.280e+02   1.526 0.127015    
## PROVINCIABurgos                -1.526e+03  1.186e+03  -1.287 0.198056    
## PROVINCIACáceres               -1.716e+03  1.228e+03  -1.397 0.162404    
## PROVINCIACádiz                 -1.124e+02  1.067e+03  -0.105 0.916133    
## PROVINCIACantabria             -8.313e+02  1.212e+03  -0.686 0.492776    
## PROVINCIACastellón              4.709e+02  1.193e+03   0.395 0.692999    
## PROVINCIACEUTA                 -7.347e+03  2.000e+03  -3.674 0.000243 ***
## PROVINCIACiudad Real           -4.723e+02  1.107e+03  -0.427 0.669730    
## PROVINCIACórdoba                1.756e+02  1.066e+03   0.165 0.869125    
## PROVINCIACuenca                -3.406e+03  1.435e+03  -2.373 0.017685 *  
## PROVINCIAGerona                 3.606e+02  1.004e+03   0.359 0.719562    
## PROVINCIAGranada               -1.502e+01  1.123e+03  -0.013 0.989326    
## PROVINCIAGuadalajara           -2.227e+03  1.389e+03  -1.603 0.109089    
## PROVINCIAGuipúzcoa              7.303e+02  1.107e+03   0.660 0.509293    
## PROVINCIAHuelva                -1.124e+03  1.285e+03  -0.875 0.381741    
## PROVINCIAHuesca                -3.282e+02  1.216e+03  -0.270 0.787297    
## PROVINCIAJaén                  -3.512e+02  1.124e+03  -0.313 0.754669    
## PROVINCIALa Coruña             -5.112e+02  1.017e+03  -0.503 0.615066    
## PROVINCIALas Palmas            -3.143e+02  1.067e+03  -0.294 0.768396    
## PROVINCIALeón                  -5.498e+02  1.100e+03  -0.500 0.617152    
## PROVINCIALérida                 4.137e+02  1.096e+03   0.378 0.705779    
## PROVINCIALogroño                6.492e+02  1.216e+03   0.534 0.593462    
## PROVINCIALugo                  -1.331e+02  1.148e+03  -0.116 0.907752    
## PROVINCIAMadrid                 1.051e+03  9.441e+02   1.113 0.265621    
## PROVINCIAMálaga                 1.323e+03  1.010e+03   1.310 0.190322    
## PROVINCIAMELILLA               -1.033e+04  2.314e+03  -4.462 8.39e-06 ***
## PROVINCIAMurcia                 1.530e+03  1.022e+03   1.497 0.134488    
## PROVINCIANavarra                1.306e+03  1.136e+03   1.149 0.250467    
## PROVINCIAOrense                -1.645e+03  1.282e+03  -1.283 0.199594    
## PROVINCIAPalencia              -3.504e+03  1.493e+03  -2.348 0.018952 *  
## PROVINCIAPontevedra             4.404e+02  1.037e+03   0.425 0.671032    
## PROVINCIASalamanca             -1.866e+03  1.229e+03  -1.518 0.129158    
## PROVINCIASegovia               -5.034e+03  1.570e+03  -3.206 0.001356 ** 
## PROVINCIASevilla                1.193e+03  9.840e+02   1.212 0.225581    
## PROVINCIASoria                 -8.177e+03  1.667e+03  -4.905 9.79e-07 ***
## PROVINCIASta. Cruz de Tenerife -3.732e+02  1.047e+03  -0.356 0.721560    
## PROVINCIATarragona              4.128e+02  1.080e+03   0.382 0.702440    
## PROVINCIATeruel                -1.757e+03  1.332e+03  -1.319 0.187160    
## PROVINCIAToledo                 7.443e+02  1.089e+03   0.684 0.494258    
## PROVINCIAValencia               1.755e+03  9.570e+02   1.834 0.066812 .  
## PROVINCIAValladolid            -7.997e+02  1.129e+03  -0.709 0.478654    
## PROVINCIAVizcaya                9.129e+02  1.034e+03   0.883 0.377330    
## PROVINCIAZamora                -3.076e+03  1.329e+03  -2.315 0.020672 *  
## PROVINCIAZaragoza               1.232e+03  1.058e+03   1.164 0.244563    
## rentabieco                      1.746e+01  6.844e+00   2.551 0.010790 *  
## rentabifin                      1.883e-01  1.272e+00   0.148 0.882315    
## endp                            5.310e+00  2.545e+00   2.086 0.037021 *  
## liq                             5.778e+00  1.474e+01   0.392 0.695101    
## PRODUCTIVIDAD                   7.100e+01  4.057e+00  17.502  < 2e-16 ***
## NÚMERO.DE.EMPLEADOS             3.875e+02  5.369e+00  72.183  < 2e-16 ***
## coe                             7.445e+04  4.431e+03  16.803  < 2e-16 ***
## edad                           -2.223e+01  1.084e+01  -2.051 0.040370 *  
## conce                           4.140e+00  1.836e+00   2.255 0.024189 *  
## numac                           4.606e+01  5.622e+01   0.819 0.412686    
## numpa                           7.075e+01  1.082e+02   0.654 0.513404    
## numest                          2.943e+02  7.006e+01   4.201 2.73e-05 ***
## estp1                           4.508e+02  4.761e+02   0.947 0.343782    
## grupo1                          5.373e+02  3.551e+02   1.513 0.130410    
## fju1                            4.178e+02  2.185e+02   1.912 0.056019 .  
## ---
## Signif. codes:  0 '***' 0.001 '**' 0.01 '*' 0.05 '.' 0.1 ' ' 1
## 
## Residual standard error: 4611 on 3455 degrees of freedom
## Multiple R-squared:  0.8318, Adjusted R-squared:  0.8286 
## F-statistic:   259 on 66 and 3455 DF,  p-value: < 2.2e-16
plot(mod2)

preds=predict(mod2, newdata = dades[-train, ])
cor.test(dades[-train, ]$VENTAS, preds, method = "sp")
## 
##  Spearman's rank correlation rho
## 
## data:  dades[-train, ]$VENTAS and preds
## S = 13384142, p-value < 2.2e-16
## alternative hypothesis: true rho is not equal to 0
## sample estimates:
##       rho 
## 0.8825604

Vemos que efectivamente el test nos da un 91% de exactitud, podemos explicar mucha varianza de las ventas con las variables de las que disponemos.

Pese a ello, vuelve a suceder algo muy parecido al modelo original, los residuos no acaban de estar dentro de valores seguros, en mi opinión es un modelo que se podría mejorar detectando y trabajando sobre los outliers.